<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Monaco Editor 语言切换示例</title>
    <!-- 引入 Monaco Editor -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.2/min/vs/loader.js"></script>
</head>
<body>
<div style="display: flex; gap: 10px; margin-bottom: 10px;">
    <button onclick="changeLanguage('go')">Go</button>
    <button onclick="changeLanguage('java')">Java</button>
    <button onclick="changeLanguage('php')">PHP</button>
</div>
<div id="editor" style="width: 800px; height: 500px; border: 1px solid #ccc;"></div>


<button onclick="submit()">提交</button>
<script>
    // 配置 Monaco Editor 路径
    require.config({ paths: { 'vs': 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.2/min/vs' } });

    let editor;

    // 初始化编辑器
    require(['vs/editor/editor.main'], function() {
        // 初始语言设为 Go
        editor = monaco.editor.create(document.getElementById('editor'), {
            value: '// 初始为 Go 代码\npackage main\n\nimport "fmt"\n\nfunc main() {\n    fmt.Println("Hello, Go!")\n}',
            language: 'go', // 初始语言
            theme: 'vs-light',
            fontSize: 14,
            minimap: { // 关闭代码缩略图
                enabled: false // 是否启用预览图
            },
            contextmenu: false
        });
    });

    function submit() {
        console.log(editor.getValue())

        // 示例：提交一段 JavaScript 代码
        const testCode = `
  const input = require('fs').readFileSync(0, 'utf-8').trim();
  const num = parseInt(input);
  console.log(\`输入的数字是：\${num}，平方是：\${num * num}\`);
`;

        // 提交代码（输入为 "5"）
        submitToJudge0(testCode, "5")
            .then(result => {
                console.log("评判结果：");
                console.log("状态：", result.status.description);
                console.log("输出：", result.stdout); // 代码的输出
                console.log("错误（如有）：", result.stderr); // 错误信息
            });

    }

    // 动态改变语言的函数
    function changeLanguage(lang) {
        // 获取当前模型
        const model = editor.getModel();
        // 设置模型语言
        monaco.editor.setModelLanguage(model, lang);

        // 根据语言设置示例代码
        switch(lang) {
            case 'go':
                editor.setValue('// Go 代码\npackage main\n\nimport "fmt"\n\nfunc main() {\n    fmt.Println("Hello, Go!")\n    fmt.Println("这是Go语言示例")\n}');
                break;
            case 'java':
                editor.setValue('// Java 代码\npublic class HelloWorld {\n    public static void main(String[] args) {\n        System.out.println("Hello, Java!");\n        System.out.println("这是Java语言示例");\n    }\n}');
                break;
            case 'php':
                editor.setValue('<?php\n// PHP 代码\necho "Hello, PHP!";\necho "\n这是PHP语言示例";\n?>');
                break;
        }
    }


    // Judge0 服务地址（根据实际情况修改）
    const JUDGE0_API_URL = "http://47.100.64.91:2358/";
    // JavaScript 的语言 ID（Judge0 中 JS 的 ID 通常是 93）
    const JS_LANGUAGE_ID = 68;

    /**
     * 提交 JavaScript 代码到 Judge0
     * @param {string} code - 要执行的 JavaScript 代码
     * @param {string} input - 代码的输入（可选）
     * @returns {Promise<Object>} 评判结果
     */
    async function submitToJudge0(code, input = "") {
        try {
            // 第一步：提交代码
            const submissionResponse = await fetch(`${JUDGE0_API_URL}/submissions`, {
                method: "POST",
                headers: {
                    "Content-Type": "application/json",
                },
                body: JSON.stringify({
                    source_code: code,          // 要执行的 JS 代码
                    language_id: JS_LANGUAGE_ID, // JavaScript 语言 ID
                    stdin: input,               // 标准输入（代码中可通过 readline 读取）
                    // 可选参数：设置超时时间（毫秒）
                    // time_limit: 2000,
                    // memory_limit: 128000,
                }),
            });

            const submission = await submissionResponse.json();
            const { token } = submission; // 获取提交令牌

            // 第二步：轮询获取结果（Judge0 需要时间处理，需等待结果就绪）
            let result;
            do {
                // 等待 500ms 后再次查询（避免频繁请求）
                await new Promise(resolve => setTimeout(resolve, 500));

                const resultResponse = await fetch(`${JUDGE0_API_URL}/submissions/${token}`);
                result = await resultResponse.json();
            } while (result.status.id === 1 || result.status.id === 2);
            // 状态 1: 排队中，2: 处理中，其他状态为完成（成功/错误）

            return result;
        } catch (error) {
            console.error("提交失败：", error);
            throw error;
        }
    }



</script>
</body>
</html>
